package com.cskaoyan.javase.array._5operation._3crud;

import java.util.Scanner;

/**
 * 数组是一个容器,可以用存放元素,数据.
 * 在实际开发中,项目中也会需要存放大量数据,这一般是通过数据库来实现的
 * 现在我们使用数组这个容器,来模拟数据库,实现日常开发中,最常见的"crud"操作
 * c: creat 新建/增加
 * r: retrieve 检索/查询
 * u: update 更新/修改
 * d: delete 删除
 * 增删改查是Java程序员最常见的需求.
 *
 * 这里给出一个String类型的数组,要求完成String类型数组的增删改查
 *
 *
 * @since 14:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        String[] arr = new String[10];
        arr[0] = "张三";
        arr[1] = "李四";
        arr[2] = "王二";
        arr[3] = "麻子";
        arr[4] = "狗蛋";
        arr[5] = "李四";
        showNames(arr);
        Scanner sc = new Scanner(System.in);
        /*System.out.println("请输入一个要新增的人名:");
        String nameInsert = sc.nextLine();
        if (createName(arr, nameInsert)) {
            // 说明插入成功
            System.out.println("插入成功!");
            showNames(arr);
        } else {
            System.out.println("插入失败!数组满了!");
        }

        System.out.println("请输入一个要删除的人名:");
        String nameDelete = sc.nextLine();
        if (deleteName(arr, nameDelete)) {
            System.out.println("删除成功!");
            showNames(arr);
        } else {
            System.out.println("删除失败!不存在目标元素");
        }*/
        /*System.out.println("请输入一个要修改的人名:");
        String nameUpdateTarget = sc.nextLine();
        System.out.println("请输入要修改成的人名:");
        String name = sc.nextLine();
        if (updateName(arr, nameUpdateTarget, name)) {
            System.out.println("修改成功!");
            showNames(arr);
        } else {
            System.out.println("修改失败!不存在目标元素!");
        }*/
        System.out.println("请输入要查找的人名:");
        String name = sc.nextLine();
        System.out.println(getLastIndexOfTarget(arr, name));
        System.out.println(getFirstIndexOfTarget(arr, name));

    }

    // 需求1: 打印这个String数组,排除null元素
    public static void showNames(String[] arr) {
        System.out.print("人名数组中的元素有: [");
        // 先手动排除数组中的null元素
        for (String name : arr) {
            if (name == null) {
                continue;
            }
            System.out.print(name + ", ");
        }
        System.out.println("\b\b]");
    }

    // 需求2: 新增一个人名

    /**
     *  插入新名字,插入成功返回true 否者返回false
     * @param arr 被插入元素的String数组
     * @param name 要新增的名字
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/03 15:05
     */
    public static boolean createName(String[] arr, String name) {
        // 将原本null元素替换成name,表示插入一个新的人名
        for (int i = 0; i < arr.length; i++) {
            // 找到一个为null的位置,将元素赋值
            if (arr[i] == null) {
                arr[i] = name;
                // 插入成功
                return true;
            }
        }
        // 插入失败,由于没有找到null的位置,因为数组满了
        return false;
    }


    // 需求3: 删除一个人名

    /**
     *  删除目标数组中的目标元素,删除成功返回true 否者返回false
     * @param arr 被删除元素的目标数组
     * @param name 被删除的目标名字
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/03 15:06
     */
    public static boolean deleteName(String[] arr, String name) {
        // 数组不能直接删除某个元素,所以这里我们用null替代原先的元素,表示删除了这个元素
        /*
            既然是删除String数组中的元素,那么怎么知道删除哪个呢?
            判断两个String字符串内容相等
            用方法equals
            这是String类中的一个方法,任何字符串对象都可以调用该方法
            用来判断两个字符串是否内容相同
            相同返回true  不同返回false
         */
        for (int i = 0; i < arr.length; i++) {
            /*
                String类的equals方法
                是用来判断两个字符串内容是否相同的
                这个方法具有对称性
                左边和右边比较,右边和左边比较结果是一致的
                所以为了避免空指针异常
                在使用这个方法时,应该尽量用不可能为null的元素去调用方法
                比较经典的使用:
                "".equals(xxx);
                这里绝对不会空指针异常
                注: 任何字符串对象equals一个null,都会返回false
             */
            if (name.equals(arr[i])) {
                // 说明存在目标元素,删除(用null替换)
                arr[i] = null;
                // 删除成功
                return true;
            }
        }
        return false;
    }

    // 需求4: 修改一个人名

    /**
     * 修改人名，成功返回true，否则返回false
     * @param arr 被修改元素的String数组
     * @param target 目标元素
     * @param newName 修改后元素的取值
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/03 15:41
     */
    public static boolean updateName(String[] arr, String target, String newName) {
        for (int i = 0; i < arr.length; i++) {
            // 查找目标元素
            if (target.equals(arr[i])) {
                // 找到了,修改元素
                arr[i] = newName;
                return true;
            }
        }
        return false;
    }

    // 需求5: 查询一个人名
    // 查找目标元素,找到了就返回目标元素的下标
    public static int getLastIndexOfTarget(String[] arr, String target) {
        int resultIndex = -1;
        for (int i = 0; i < arr.length; i++) {
            if (target.equals(arr[i])) {
                resultIndex = i;
            }
        }
        return resultIndex;
    }

    public static int getFirstIndexOfTarget(String[] arr, String target) {
        int resultIndex = -1;
        for (int i = 0; i < arr.length; i++) {
            if (target.equals(arr[i])) {
                resultIndex = i;
                break;
            }
        }
        return resultIndex;
    }
}
